package com.minglan.leetcode.java.solution2101;

/*
给你一个字符串 s ，它只包含三种字符 a, b 和 c 。

请你返回 a，b 和 c 都 至少 出现过一次的子字符串数目。

示例 1：

输入：s = "abcabc"
输出：10
解释：包含 a，b 和 c 各至少一次的子字符串为 "abc", "abca", "abcab", "abcabc", "bca", "bcab", "bcabc", "cab", "cabc" 和 "abc" (相同字符串算多次)。
示例 2：

输入：s = "aaacb"
输出：3
解释：包含 a，b 和 c 各至少一次的子字符串为 "aaacb", "aacb" 和 "acb" 。
 */
public class Solution1358 {

	public static void main(String[] args) {
		String s="aaabc";
		Solution1358 so= new Solution1358();
		System.out.println(so.numberOfSubstrings(s));

	}

    public int numberOfSubstrings(String s) {
        int cnt=0;
        int start=0;
        int size=s.length();
        int[] chatcnt={0,0,0};
        /* 窗口右边界滑动 */
        for(int end=0;end < size;end++) {
            char c=s.charAt(end);
            chatcnt[c-'a']+=1;
            if(chatcnt[0]>0&&chatcnt[1]>0&&chatcnt[2]>0) {
                cnt += (size - end);
                /* 窗口左边界滑动 */
                for(int s1=start;s1<end;s1++) {
	                char f=s.charAt(start);
	                start++;
	                chatcnt[f-'a']--;
	                if(chatcnt[0]>0&&chatcnt[1]>0&&chatcnt[2]>0) {
	                	cnt += (size - end);
	                }else {
	                	break;
	                }
                }
            }
        }
        return cnt;
    }
}
